package com.leo;

import com.leo.pojo.User;

import java.sql.*;


/**
 * 问题探索
 * 1. 数据库驱动，连接地址等存在硬编码  (配置文件)
 * 2. 频繁创建关闭connection  (连接池)
 * 3. sql设置参数，结果集获取参数均存在硬编码
 * 4. 封装对象繁琐(使用反射，内省)
 *
 *
 * 封装ORM
 * 一. 使用方提供两个配置，解决数据库连接，sql(参数，类型，返回值)的硬编码问题
 *    1. sqlMapConfig.xml (数据库配置, 同时添加mapper.xml路径配置)
 *    2. mapper.xml       (sql配置)
 *
 * 二. ORM框架
 *    1. 根据配置文件路径，加载2个配置文件为字节输入流，getResourceAsStream(path)
 *    2. 创建2个javabean，放置配置
 *       Configuration: 核心配置类，存放sqlMapConfig.xml解析的内容
 *       MappedStatement: 映射配置类，存放mapper.xml解析的内容
 *
 * 三. 解析配置(dom4j)
 *    1. SqlSessionFactoryBuilder: build(InputStream is)
 *    2. 使用dom4j解析配置文件，内容封装到2个bean
 *
 * 四. 创建SqlSessionFactory接口以及实现DefaultSqlSessionFactory
 *    1. openSession()，生产sqlSession会话对象 (工厂模式)
 *
 * 五. 创建SqlSession接口，以及实现类 DefaultSqlSession
 *    定义 数据库的 CURD操作: selectList()
 *                          selectOne()
 *                          update()
 *                          delete()
 * 六. 创建Executor接口, 以及实现类SimpleExecutor
 *     query(Configuration, MappedStatement, Object... params) 执行JDBC代码
 */
public class jdbc {
    public static void main(String[] args) throws SQLException {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过驱动获取连接
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mybatis-test?characterEncoding=utf-8",
                    "root",
                    "1234");

            String sql = "select * from user where username = ?";
            // 获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            // 第一个参数为语句中参数序号(1开始), 第二个参数为参数值, 替换占位符?
            preparedStatement.setString(1, "tom");
            // 查询结果集
            resultSet = preparedStatement.executeQuery();

            // 循环遍历结果集
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                User user = User.builder().id(id).username(username).build();
                System.out.println(user);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (preparedStatement != null)
                preparedStatement.close();
            if (resultSet != null)
                resultSet.close();
            if (connection != null)
                connection.close();
        }
    }
}


